package ar.com.sistventa.form.articulos;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;

import ar.com.sistventa.entities.Articulo;
import ar.com.sistventa.entities.Categoria;
import ar.com.sistventa.entities.Marca;
import ar.com.sistventa.entities.Unidad;
import ar.com.sistventa.form.articulos.impl.AgregarModificarArticulosFormImpl;
import ar.com.sistventa.utils.Constantes;
import ar.com.sistventa.utils.ValidacionCampo;

public class AgregarModificarArticulosForm extends JDialog {

	private static final long serialVersionUID = 1L;
	private final JPanel contentPanel = new JPanel();
	private JTextField txtCodigo;
	private JTextField txtDescripcion;
	private JTextField txtCategoria;
	private JTextField txtMarca;
	private JTextField txtUnidad;
	private JTextField txtProveedor;
	private JTextField txtCodigoBarra;
	private JTextField txtStock;
	private JTextField txtStockMinimo;
	private JTextField txtPrecioCosto;
	private JTextField txtGananciaPesos;
	private JTextField txtPrecioSinIva;
	private JButton btnCategoria;
	private JButton btnMarca;
	private JButton btnUnidad;
	private JButton btnGuardar;
	private JButton btnModificar;

	private AgregarModificarArticulosFormImpl agregarModificarArticulosFormImpl;
	private Articulo articulo;
	private Categoria categoria;
	private Marca marca;
	private Unidad unidad;
	private Integer tipoVentana;
	private JTextField txtPrecioVenta;
	private JTextField txtGananciaPorcentaje;
	private JTextField txtIva;

	/**
	 * Create the dialog.
	 * 
	 * @wbp.parser.constructor
	 */
	public AgregarModificarArticulosForm(JDialog parent, Articulo articulo,
			Integer tipoVentana) {
		super(parent, true);
		setResizable(false);
		this.articulo = articulo;
		this.tipoVentana = tipoVentana;
		agregarModificarArticulosFormImpl = new AgregarModificarArticulosFormImpl();
		initForm();
		inicializar();
	}

	public AgregarModificarArticulosForm(JFrame parent, Articulo articulo,
			Integer tipoVentana) {
		super(parent, true);
		setResizable(false);
		this.articulo = articulo;
		this.tipoVentana = tipoVentana;
		agregarModificarArticulosFormImpl = new AgregarModificarArticulosFormImpl();
		initForm();
		inicializar();
	}

	private void initForm() {
		setBounds(100, 100, 580, 502);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		contentPanel.setLayout(null);

		JPanel panelDescripcionArticulo = new JPanel();
		panelDescripcionArticulo.setBorder(new TitledBorder(new LineBorder(
				new Color(0, 0, 0)), " Descripcion ", TitledBorder.LEADING,
				TitledBorder.TOP, null, null));
		panelDescripcionArticulo.setBounds(10, 10, 540, 163);
		contentPanel.add(panelDescripcionArticulo);
		panelDescripcionArticulo.setLayout(null);

		JLabel lblCodigo = new JLabel("Codigo:");
		lblCodigo.setBounds(10, 28, 46, 14);
		panelDescripcionArticulo.add(lblCodigo);

		JLabel lblDescripcion = new JLabel("Descripcion:");
		lblDescripcion.setBounds(10, 58, 64, 14);
		panelDescripcionArticulo.add(lblDescripcion);

		JLabel lblMarca = new JLabel("Marca:");
		lblMarca.setBounds(10, 88, 46, 14);
		panelDescripcionArticulo.add(lblMarca);

		JLabel lblUnidad = new JLabel("Unidad:");
		lblUnidad.setBounds(10, 118, 46, 14);
		panelDescripcionArticulo.add(lblUnidad);

		txtUnidad = new JTextField();
		txtUnidad.setEditable(false);
		txtUnidad.setBackground(Color.WHITE);
		txtUnidad.setBounds(80, 114, 85, 20);
		panelDescripcionArticulo.add(txtUnidad);
		txtUnidad.setColumns(10);

		btnUnidad = new JButton("");
		btnUnidad.setToolTipText("Buscar");
		btnUnidad.setIcon(new ImageIcon(Constantes.IMAGEN_BUSCAR));
		btnUnidad.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				eventoBotonUnidad();
			}
		});
		btnUnidad.setBounds(170, 114, 27, 21);
		panelDescripcionArticulo.add(btnUnidad);

		txtMarca = new JTextField();
		txtMarca.setEditable(false);
		txtMarca.setBackground(Color.WHITE);
		txtMarca.setBounds(80, 84, 150, 20);
		panelDescripcionArticulo.add(txtMarca);
		txtMarca.setColumns(10);

		txtDescripcion = new JTextField();
		txtDescripcion.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.verificarLargoCamposJTextField(e,
						txtDescripcion, 40);
			}
		});
		txtDescripcion.addFocusListener(new FocusAdapter() {
			@Override
			public void focusGained(FocusEvent e) {
				txtDescripcion.selectAll();
			}
		});
		txtDescripcion.setBackground(Color.WHITE);
		txtDescripcion.setBounds(80, 54, 150, 20);
		panelDescripcionArticulo.add(txtDescripcion);

		txtCodigo = new JTextField();
		txtCodigo.addFocusListener(new FocusAdapter() {
			@Override
			public void focusGained(FocusEvent e) {
				txtCodigo.selectAll();
			}
		});
		txtCodigo.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.verificarLargoCamposJTextField(e, txtCodigo, 8);
			}
		});
		txtCodigo.setBackground(Color.WHITE);
		txtCodigo.setBounds(80, 24, 86, 20);
		panelDescripcionArticulo.add(txtCodigo);
		txtCodigo.setColumns(10);

		btnMarca = new JButton("");
		btnMarca.setToolTipText("Buscar");
		btnMarca.setIcon(new ImageIcon(Constantes.IMAGEN_BUSCAR));
		btnMarca.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				eventoBotonMarca();
			}
		});
		btnMarca.setBounds(235, 84, 27, 21);
		panelDescripcionArticulo.add(btnMarca);

		txtCategoria = new JTextField();
		txtCategoria.setBackground(Color.WHITE);
		txtCategoria.setEditable(false);
		txtCategoria.setBounds(350, 54, 150, 20);
		panelDescripcionArticulo.add(txtCategoria);
		txtCategoria.setColumns(10);

		JLabel lblCategoria = new JLabel("Categoria:");
		lblCategoria.setBounds(275, 58, 64, 14);
		panelDescripcionArticulo.add(lblCategoria);

		btnCategoria = new JButton("");
		btnCategoria.setToolTipText("Buscar");
		btnCategoria.setIcon(new ImageIcon(Constantes.IMAGEN_BUSCAR));
		btnCategoria.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				eventoBotonCategoria();
			}
		});
		btnCategoria.setBounds(505, 54, 27, 21);
		panelDescripcionArticulo.add(btnCategoria);

		JLabel lblCodgoBarra = new JLabel("Codgo Barra:");
		lblCodgoBarra.setBounds(275, 89, 75, 14);
		panelDescripcionArticulo.add(lblCodgoBarra);

		txtCodigoBarra = new JTextField();
		txtCodigoBarra.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				ValidacionCampo.verificarLargoCamposJTextField(e,
						txtCodigoBarra, 30);
			}
		});
		txtCodigoBarra.addFocusListener(new FocusAdapter() {
			@Override
			public void focusGained(FocusEvent e) {
				txtCodigoBarra.selectAll();
			}
		});
		txtCodigoBarra.setBackground(Color.WHITE);
		txtCodigoBarra.setBounds(350, 84, 150, 20);
		panelDescripcionArticulo.add(txtCodigoBarra);
		txtCodigoBarra.setColumns(10);

		JPanel panelStockGanancia = new JPanel();
		panelStockGanancia.setBorder(new TitledBorder(new LineBorder(new Color(
				0, 0, 0)), " Stock y Ganancia ", TitledBorder.LEADING,
				TitledBorder.TOP, null, null));
		panelStockGanancia.setBounds(10, 184, 540, 214);
		contentPanel.add(panelStockGanancia);
		panelStockGanancia.setLayout(null);

		JLabel lblStock = new JLabel("Stock:");
		lblStock.setBounds(10, 28, 46, 14);
		panelStockGanancia.add(lblStock);

		JLabel lblStockMinimo = new JLabel("Stock Minimo:");
		lblStockMinimo.setBounds(170, 28, 76, 14);
		panelStockGanancia.add(lblStockMinimo);

		JLabel lblPrecioCosto = new JLabel("Precio Costo:");
		lblPrecioCosto.setBounds(10, 108, 76, 14);
		panelStockGanancia.add(lblPrecioCosto);

		JLabel lblGananciaPesos = new JLabel("Ganancia ($):");
		lblGananciaPesos.setBounds(330, 108, 76, 14);
		panelStockGanancia.add(lblGananciaPesos);

		JLabel lbPrecioSinIva = new JLabel("Precio sin IVA:");
		lbPrecioSinIva.setBounds(10, 138, 80, 14);
		panelStockGanancia.add(lbPrecioSinIva);

		txtStock = new JTextField();
		txtStock.setBounds(80, 25, 65, 20);
		panelStockGanancia.add(txtStock);
		txtStock.setColumns(10);

		txtStockMinimo = new JTextField();
		txtStockMinimo.setBounds(245, 25, 65, 20);
		panelStockGanancia.add(txtStockMinimo);
		txtStockMinimo.setColumns(10);

		txtPrecioCosto = new JTextField();
		txtPrecioCosto.setBounds(90, 105, 60, 20);
		panelStockGanancia.add(txtPrecioCosto);
		txtPrecioCosto.setColumns(10);

		txtGananciaPesos = new JTextField();
		txtGananciaPesos.setBounds(405, 105, 60, 20);
		panelStockGanancia.add(txtGananciaPesos);
		txtGananciaPesos.setColumns(10);

		txtPrecioSinIva = new JTextField();
		txtPrecioSinIva.setBounds(90, 135, 60, 20);
		panelStockGanancia.add(txtPrecioSinIva);
		txtPrecioSinIva.setColumns(10);

		JSeparator sepStockGanancia = new JSeparator();
		sepStockGanancia.setBounds(10, 90, 515, 2);
		panelStockGanancia.add(sepStockGanancia);

		txtProveedor = new JTextField();
		txtProveedor.setBounds(80, 55, 150, 20);
		panelStockGanancia.add(txtProveedor);
		txtProveedor.setColumns(10);

		JButton btnProveedor = new JButton("");
		btnProveedor.setToolTipText("Buscar");
		btnProveedor.setIcon(new ImageIcon(Constantes.IMAGEN_BUSCAR));
		btnProveedor.setBounds(240, 55, 27, 21);
		panelStockGanancia.add(btnProveedor);

		JLabel lblProveedor = new JLabel("Proveedor:");
		lblProveedor.setBounds(10, 58, 75, 14);
		panelStockGanancia.add(lblProveedor);

		JLabel lblPrecioVenta = new JLabel("Precio Venta:");
		lblPrecioVenta.setBounds(330, 138, 76, 14);
		panelStockGanancia.add(lblPrecioVenta);

		txtPrecioVenta = new JTextField();
		txtPrecioVenta.setBounds(405, 135, 60, 20);
		panelStockGanancia.add(txtPrecioVenta);
		txtPrecioVenta.setColumns(10);

		JLabel lblGananciaPorcentaje = new JLabel("Ganancia (%):");
		lblGananciaPorcentaje.setBounds(170, 108, 77, 14);
		panelStockGanancia.add(lblGananciaPorcentaje);

		txtGananciaPorcentaje = new JTextField();
		txtGananciaPorcentaje.setBounds(250, 105, 60, 20);
		panelStockGanancia.add(txtGananciaPorcentaje);
		txtGananciaPorcentaje.setColumns(10);

		JLabel lblIva = new JLabel("IVA:");
		lblIva.setBounds(170, 138, 46, 14);
		panelStockGanancia.add(lblIva);

		txtIva = new JTextField();
		txtIva.setBounds(250, 135, 60, 20);
		panelStockGanancia.add(txtIva);
		txtIva.setColumns(10);

		btnGuardar = new JButton("");
		btnGuardar.setToolTipText("Guardar");
		btnGuardar.setIcon(new ImageIcon(Constantes.IMAGEN_GUARDAR));
		btnGuardar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				eventoBotonAceptar();
			}
		});
		btnGuardar.setBounds(510, 409, 40, 40);
		contentPanel.add(btnGuardar);

		btnModificar = new JButton("");
		btnModificar.setToolTipText("Modificar");
		btnModificar.setIcon(new ImageIcon(Constantes.IMAGEN_MODIFICAR));
		btnModificar.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				eventoBotonModificar();
			}
		});
		btnModificar.setBounds(457, 409, 40, 40);
		contentPanel.add(btnModificar);
	}

	private void inicializar() {
		if (tipoVentana == Constantes.AGREGAR) {
			setTitle("Nuevo Articulo");
			btnModificar.setVisible(false);
			articulo = new Articulo();
			btnGuardar.setToolTipText("Guardar");
			btnGuardar.setIcon(new ImageIcon(Constantes.IMAGEN_GUARDAR));
		}
		if (tipoVentana == Constantes.MODIFICAR) {
			setTitle("Modificar Articulo");
			btnModificar.setVisible(false);
			completarArticulo();
			habilitarCampos(true);
			categoria = articulo.getCategoria();
			marca = articulo.getMarca();
			unidad = articulo.getUnidad();
		}
		if (tipoVentana == Constantes.VER) {
			setTitle("Ver Articulo");
			completarArticulo();
			habilitarCampos(false);
			categoria = articulo.getCategoria();
			marca = articulo.getMarca();
			unidad = articulo.getUnidad();
			btnGuardar.setToolTipText("Aceptar");
			btnGuardar.setIcon(new ImageIcon(Constantes.IMAGEN_CONFIRMAR));
		}
	}

	private void eventoBotonAceptar() {
		if (tipoVentana == Constantes.VER) {
			this.setVisible(false);
			this.dispose();
		}
		String codigo = txtCodigo.getText().trim().toUpperCase();
		String descripcion = txtDescripcion.getText().trim().toUpperCase();
		String codigoBarra = txtCodigoBarra.getText().trim().toUpperCase();
		// Stock y Precio
		Float stock = 0F;
		Float stockMinimo = 0F;
		Float precioCosto = 0F;
		Float ganancia = 0F;
		Float precioVentaSinIva = 0F;
		Float precioIva = 0F;
		Float precioVentaConIva = 0F;
		Float porcentajeGanancia = 0F;

		try {
			stock = Float.parseFloat(txtStock.getText().trim());

		} catch (Exception e) {
			stock = 0F;

		}
		try {
			stockMinimo = Float.parseFloat(txtStockMinimo.getText().trim());
		} catch (Exception e) {
			stockMinimo = 0F;
		}

		try {
			precioCosto = Float.parseFloat(txtPrecioCosto.getText().trim());
		} catch (Exception e) {
			precioCosto = 0F;
		}

		try {
			ganancia = Float.parseFloat(txtGananciaPesos.getText().trim());
		} catch (Exception e) {
			ganancia = 0F;
		}

		try {
			precioVentaSinIva = Float.parseFloat(txtPrecioSinIva.getText()
					.trim());
		} catch (Exception e) {
			precioVentaSinIva = 0F;
		}

		try {
			precioIva = Float.parseFloat(txtIva.getText().trim());
		} catch (Exception e) {
			precioIva = 0F;
		}

		try {
			precioVentaConIva = Float.parseFloat(txtPrecioVenta.getText()
					.trim());
		} catch (Exception e) {
			precioVentaConIva = 0F;
		}

		try {
			porcentajeGanancia = Float.parseFloat(txtGananciaPorcentaje
					.getText().trim());
		} catch (Exception e) {
			porcentajeGanancia = 0F;
		}

		if (!codigo.trim().equals("") && !descripcion.trim().equals("")) {
			articulo.setCodigo(codigo);
			articulo.setDescripcion(descripcion);
			articulo.setCategoria(categoria);
			articulo.setMarca(marca);
			articulo.setUnidad(unidad);
			articulo.setCodigoBarra(codigoBarra);
			// Stock y Precio
			articulo.setStock(stock);
			articulo.setStockMinimo(stockMinimo);
			articulo.setPrecioCosto(precioCosto);
			articulo.setGanancia(ganancia);
			articulo.setPrecioVentaSinIva(precioVentaSinIva);
			articulo.setPrecioIva(precioIva);
			articulo.setPrecioVentaConIva(precioVentaConIva);
			articulo.setPorcentajeGanancia(porcentajeGanancia);

			if (tipoVentana == Constantes.AGREGAR) {
				agregarModificarArticulosFormImpl.agregarArticulo(articulo);
				JOptionPane.showMessageDialog(this, "Se guardo el articulo.",
						"Guardado", JOptionPane.INFORMATION_MESSAGE);
			}

			if (tipoVentana == Constantes.MODIFICAR) {
				agregarModificarArticulosFormImpl.modificarArticulo(articulo);
				JOptionPane.showMessageDialog(this, "Se modifico el articulo.",
						"Guardado", JOptionPane.INFORMATION_MESSAGE);
			}

			this.setVisible(false);
			this.dispose();

		}

	}

	private void eventoBotonCategoria() {
		if (btnCategoria.isEnabled()) {
			CategoriaForm categoriaForm = new CategoriaForm(this);
			categoriaForm.setVisible(true);
			categoria = categoriaForm.getCategoria();
			categoriaForm.dispose();

			if (categoria != null) {
				txtCategoria.setText(categoria.getDescripcion());
			}
		}
	}

	private void eventoBotonMarca() {
		if (btnMarca.isEnabled()) {
			MarcaForm marcaForm = new MarcaForm(this);
			marcaForm.setVisible(true);
			marca = marcaForm.getMarca();
			marcaForm.dispose();

			if (marca != null) {
				txtMarca.setText(marca.getDescripcion());
			}
		}
	}

	private void eventoBotonUnidad() {
		if (btnUnidad.isEnabled()) {
			UnidadForm unidadForm = new UnidadForm(this);
			unidadForm.setVisible(true);
			unidad = unidadForm.getUnidad();
			unidadForm.dispose();

			if (unidad != null) {
				txtUnidad.setText(unidad.getDescripcion());
			}
		}
	}

	private void eventoBotonModificar() {
		setTitle("Modificar Articulo");
		btnModificar.setVisible(false);
		btnGuardar.setToolTipText("Guardar");
		btnGuardar.setIcon(new ImageIcon(Constantes.IMAGEN_GUARDAR));
		completarArticulo();
		habilitarCampos(true);
		tipoVentana = Constantes.MODIFICAR;
	}

	private void completarArticulo() {
		if (articulo != null) {
			txtCodigo.setText(articulo.getCodigo());
			txtDescripcion.setText(articulo.getDescripcion());
			if (articulo.getCategoria() != null) {
				txtCategoria.setText(articulo.getCategoria().getDescripcion());
			}
			if (articulo.getMarca() != null) {
				txtMarca.setText(articulo.getMarca().getDescripcion());
			}
			if (articulo.getUnidad() != null) {
				txtUnidad.setText(articulo.getUnidad().getDescripcion());
			}

			txtCodigoBarra.setText(articulo.getCodigoBarra());

		}
	}

	private void habilitarCampos(boolean estado) {
		txtCodigo.setEnabled(estado);
		txtDescripcion.setEnabled(estado);
		txtCategoria.setEnabled(estado);
		txtMarca.setEnabled(estado);
		txtUnidad.setEnabled(estado);
		txtCodigoBarra.setEnabled(estado);
		btnCategoria.setEnabled(estado);
		btnMarca.setEnabled(estado);
		btnUnidad.setEnabled(estado);
	}
}
